4 REM   ******************************************
6 REM   ** (DFT4.02A) GENERATE/ANALYZE WAVEFORM **
8 REM   ******************************************
10 Q = 32
12 PI = 3.141592653589793#: P2 = 2 * PI: K1 = P2 / Q: K2 = 1 / PI
14 DIM C(2, Q), S(2, Q), KC(2, Q), KS(2, Q)
16 CLS : FOR J = 0 TO Q: FOR I = 1 TO 2: C(I, J) = 0: S(I, J) = 0: NEXT: NEXT
20 CLS : REM *    MAIN MENU    *
22 PRINT : PRINT : PRINT "         MAIN MENU": PRINT
24 PRINT " 1 = ADDITION THEOREM": PRINT
31 PRINT " 2 = EXIT": PRINT : PRINT
32 PRINT SPC(10); "MAKE SELECTION";
34 A$ = INKEY$: IF A$ = "" THEN 34
36 A = VAL(A$): ON A GOSUB 300, 1000
38 GOTO 20
40 CLS : N = 1: M = 2: K5 = Q: K6 = -1: GOSUB 108
42 FOR J = 0 TO Q: C(2, J) = 0: S(2, J) = 0: NEXT
44 GOSUB 200: REM - PERFORM DFT
46 GOSUB 140: REM - PRINT OUT FINAL VALUES
48 PRINT : INPUT "C/R TO CONTINUE"; A$
50 RETURN
80 CLS : GOSUB 150: REM PRINT HEADING
81 FOR I = 0 TO Q - 1: C(1, I) = 0: S(1, I) = 0: NEXT
82 N = 2: M = 1: K5 = 1: K6 = 1
84 GOSUB 200: REM INVERSE TRANSFORM
86 GOSUB 140: REM PRINT OUTPUT
88 PRINT : INPUT "C/R TO CONTINUE"; A$
90 RETURN
100 REM  ******************************************
102 REM  *         PROGRAM SUBROUTINES            *
104 REM  ******************************************
106 REM  *       PRINT COLUMN HEADINGS            *
108 PRINT : PRINT
110 PRINT "FREQ    F(COS)      F(SIN)      FREQ     F(COS)    F(SIN)"
112 PRINT
114 RETURN
137 REM ******************************
138 REM *       PRINT OUTPUT         *
139 REM ******************************
140 FOR Z = 0 TO Q / 2 - 1
142 PRINT Z; "    ";
144 PRINT USING "##.#####_    "; C(M, Z); S(M, Z);
145 PRINT Z + Q / 2; "    ";
146 PRINT USING "##.#####_    "; C(M, Z + Q / 2); S(M, Z + Q / 2)
147 NEXT Z
148 RETURN
150 REM ******************************
152 REM *    PRINT COLUMN HEADINGS   *
154 PRINT
156 PRINT "                       RECONSTRUCTION": PRINT
158 PRINT " T      f(REAL)     f(IMAG)     T       f(REAL)     f(IMAG)": PRINT
160 RETURN
200 REM *******************************
202 REM *     TRANSFORM/RECONSTRUCT   *
204 REM *******************************
206 FOR J = 0 TO Q - 1: REM SOLVE EQNS FOR EACH FREQUENCY
208 FOR I = 0 TO Q - 1: REM MULTIPLY AND SUM EACH POINT
210 C(M, J) = C(M, J) + C(N, I) * COS(J * I * K1) + K6 * S(N, I) * SIN(J * I * K1)
211 S(M, J) = S(M, J) - K6 * C(N, I) * SIN(J * I * K1) + S(N, I) * COS(J * I * K1)
212 NEXT I
214 C(M, J) = C(M, J) / K5: S(M, J) = S(M, J) / K5: REM SCALE RESULTS
216 NEXT J
218 RETURN
220 REM *******************************
222 REM *        PLOT FUNCTIONS       *
224 REM *******************************
225 SFF = .5: SFT = 1
226 SCREEN 9, 1, 1, 1: COLOR 9, 1: CLS : YF = -1: YT = -1
228 LINE (0, 5)-(0, 155): LINE (0, 160)-(0, 310)
230 LINE (0, 155)-(600, 155): LINE (0, 310)-(600, 310)
232 GOSUB 266
234 COLOR 15, 1
236 FOR N = 0 TO Q - 1
238 GOSUB 260
240 LINE (X, Y)-(X, Y): LINE (X, Z)-(X, Z)
242 NEXT N
244 LOCATE 4, 15: PRINT "FREQUENCY DOMAIN"
246 LOCATE 18, 15: PRINT "TIME DOMAIN"
248 LOCATE 24, 1
250 INPUT "C/R TO CONTINUE"; A$
252 SCREEN 0, 0, 0
254 RETURN
256 REM *******************************
260 Y = SQR(C(2, N) ^ 2 + S(2, N) ^ 2): Y = 155 - (YF * Y)
262 X = N * 600 / Q: Z = 310 - (YT * C(1, N))
264 RETURN
265 REM *******************************
266 YF = 150 / SFF: YT = 150 / SFT: LINE (0, 5)-(5, 5): LINE (0, 80)-(5, 80)
268 LINE (0, 160)-(5, 160): LINE (0, 235)-(5, 235)
270 LOCATE 1, 2: PRINT SFF: LOCATE 6, 2: PRINT SFF / 2
272 LOCATE 12, 2: PRINT SFT: LOCATE 17, 2: PRINT SFT / 2
274 RETURN
299 REM *******************************
300 CLS : REM *    ADDITION THEOREM    *
301 REM *******************************
302 FOR I = 0 TO Q - 1: C(1, I) = 0: S(1, I) = 0
304 FOR J = 1 TO 2: KC(J, I) = 0: KS(J, I) = 0: NEXT: NEXT
306 GOSUB 900
308 REM *** GENERATE ADDITION TEST FUNCTION ***
310 PRINT : PRINT SPC(13); "EXPONENTIAL RISING EDGE": PRINT
312 FOR I = O TO Q / 2 - 1: C(1, I) = 1 - EXP(-I / 5): NEXT
314 GOSUB 158
316 M = 1: GOSUB 140
318 PRINT : INPUT "C/R TO CONTINUE"; A$
320 GOSUB 40
322 GOSUB 220
324 FOR I = O TO Q - 1: KC(1, I) = C(1, I): KC(2, I) = C(2, I): KS(2, I) = S(2, I): NEXT
326 FOR I = 0 TO Q - 1: C(1, I) = 0: NEXT
328 PRINT : PRINT SPC(13); "EXPONENTIAL FALLING EDGE": PRINT
330 K4 = 1 - EXP(-Q / 10)
332 FOR I = Q / 2 TO Q - 1: C(1, I) = K4 * EXP(-(I - (Q / 2)) / 5): NEXT
334 GOSUB 158: REM PRINT HEADING
336 M = 1: GOSUB 140: REM INPUT DATA
338 PRINT : INPUT "C/R TO CONTINUE"; A$
340 GOSUB 40: REM TRANSFORM DATA
341 GOSUB 220: REM PLOT DATA
342 CLS : PRINT SPC(5); "SUM XFORMS OF RISING AND FALLING EXPONENTIAL FUNCTIONS"
343 FOR I = 0 TO Q - 1: C(2, I) = C(2, I) + KC(2, I): S(2, I) = S(2, I) + KS(2, I): NEXT
344 M = 2: PRINT : GOSUB 108: REM PRINT HEADING
345 GOSUB 140: REM PRINT SUM OF XFORMS
346 PRINT : INPUT "C/R TO CONTINUE"; A$
347 CLS : GOSUB 150: REM PRINT HEADING
348 GOSUB 81: REM INVERSE TRANSFORM W/O HEADING
349 GOSUB 220: REM PLOT DATA
350 REM * SUM BOTH RISING AND FALLING TIME DOMAIN FUNCTIONS *
351 GOSUB 900
352 PRINT : PRINT SPC(10); "EXPONENTIAL RISING EDGE";
354 FOR I = O TO Q / 2 - 1: C(1, I) = 1 - EXP(-I / 5): NEXT
356 PRINT " + EXPONENTIAL FALLING EDGE": PRINT
358 K4 = 1 - EXP(-Q / 10)
360 FOR I = Q / 2 TO Q - 1: C(1, I) = K4 * EXP(-(I - (Q / 2)) / 5): NEXT
362 GOSUB 158: REM PRINT HEADING
364 M = 1: GOSUB 140: REM PRINT INPUT DATA
366 PRINT : INPUT "C/R TO CONTINUE"; A$
368 GOSUB 40: REM TRANSFORM DATA
370 GOSUB 220: REM PLOT DATA
372 RETURN
900 CLS : SCREEN 9, 1, 1: COLOR 15, 1: REM TEST DESCRIPTION
902 FOR DACNT = 1 TO 10
904 READ A$: PRINT A$
906 NEXT
908 INPUT "C/R TO CONTINUE"; A$
910 SCREEN 0, 0, 0: RETURN
920 DATA "                TEST 1"
922 DATA " "
924 DATA "In this illustration we generate a rising exponential function from"
926 DATA "the equation Y1 = 1-EXP(-x/T1) and find its transform.  Next"
928 DATA "we generate a time displaced falling exponential function from the"
930 DATA "equation Y2 = A1*EXP(-x/T1), and sum its transform with the"
932 DATA "transform of Y1.  We then take the inverse transform of this"
934 DATA "summation which yields the time domain equivalent of the sum"
936 DATA "of the two time domain functions."
938 DATA " "
940 DATA "                TEST 2"
942 DATA " "
944 DATA "In the following illustration we sum together the two time"
946 DATA "domain functions (i.e. the rising and the falling exponentials)"
948 DATA "and take the forward transform of this function.  The"
950 DATA "resulting frequency spectrum is, of course, the same"
952 DATA "as the spectrum obtained by summing the transform"
954 DATA "of the rising exponential with the transform of the"
956 DATA "falling exponential."
958 DATA " "
1000 STOP



